package cn.edu.lingnan.service.user;

import cn.edu.lingnan.bean.User;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;

import javax.persistence.Id;


public interface UserService {

    /**
     * 1、方法命名凡是进行绑定查询
     * @param userName
     * @param passWord
     * @return
     */
    User login(String userName, String passWord);

    User saveUser(User user);


    /**
     * @Caching 是：@Cacheable、 @CachePut、 @CacheEvict 注解的组合
     *  其拥有三个属性；cacheable 、put 、 evict , 分别用于指定 @Cacheabel、 @CachePut 、 @CacheEvict
     *  作用：
     *      1、当使用指定名字查询数据库后，数据保存到缓存
     *      2、只要是对应的属性id，username，age就会直接缓存，而不是查询数据库
     */
    @Caching(
            /**
             * methodName ====> key = "#root.methodName" =====> 当前被调用的方法
             * target ======> key = "#root.target" =======> 当前被调用的目标对象
             * targetClass ==> key = "#root.targetClass" ==> 当前被调用的目标对象类
             * "@a0"、"#p0" 方法的参数的名字， 0表示索引
             * result ==> 方法执行后的返回值 ===> "#result.id"
            */

            cacheable = {@Cacheable(value = "cacheDemo", key = "#result+'dataMap'")},
            put = {
                    @CachePut(value = "cacheDemo",key = "#result.userName"),
                        @CachePut(value = "cacheDemo",key = "#result.age"),
            }

    )
    User findUserById(Integer id);




}

